/*
 * rect_utilits.h
 *
 *  Created on: 2016年4月18日
 *      Author: guyadong
 */

#ifndef FACEDETECT_CL_FILES_RECT_UTILITS_H_
#define FACEDETECT_CL_FILES_RECT_UTILITS_H_
#ifdef __OPENCL_VERSION__
///////////////////////////////////////////////////////////////////////////////
//! @brief  : return intersectant rectangle between rect1 and rect2
// 			  xy left top ,zw right bottom
////////////////////////////////////////////////////////////////////////////////
inline float4 intersect_rectangle_norm(const float4 rect1,const float4 rect2){return(float4)(max(rect1.xy,rect2.xy),min(rect1.zw,rect2.zw));}
inline int4 intersect_rectangle(const int4 rect1,const int4 rect2){return(int4)(max(rect1.xy,rect2.xy),min(rect1.zw,rect2.zw));}
///////////////////////////////////////////////////////////////////////////////
//! @brief  : return true if rect.x<rect.z && rect.y<rect.w
// 			  xy left top ,zw right bottom
////////////////////////////////////////////////////////////////////////////////
inline bool is_valid_rectangle_norm(const float4 rect){return rect.x<rect.z && rect.y<rect.w;}
inline bool is_valid_rectangle(const int4 rect){return rect.x<rect.z && rect.y<rect.w;}
///////////////////////////////////////////////////////////////////////////////
//! @brief  : jude whether is intersect between rect1 and rect2
// 			  xy left top ,zw right bottom
////////////////////////////////////////////////////////////////////////////////
inline bool is_intersectant_rectangle_norm(const float4 rect1,const float4 rect2){
	return is_valid_rectangle_norm(intersect_rectangle_norm(rect1,rect2));
}
inline bool is_intersectant_rectangle(const int4 rect1,const int4 rect2){
	return is_valid_rectangle(intersect_rectangle(rect1,rect2));
}
///////////////////////////////////////////////////////////////////////////////
//! @brief  : return true if rect1 == rect2
// 			  xy left top ,zw right bottom
////////////////////////////////////////////////////////////////////////////////
inline bool is_equal_rect_norm(const float4 rect1,const float4 rect2){
	return rect2.x==rect1.x && rect2.y==rect1.y && rect2.z==rect1.z && rect2.z==rect1.z;
}
inline bool is_equal_rect(const int4 rect1,const int4 rect2){
	return rect2.x==rect1.x && rect2.y==rect1.y && rect2.z==rect1.z && rect2.z==rect1.z;
}
///////////////////////////////////////////////////////////////////////////////
//! @brief  : return true if rect1 is included  by rect2
// 			  xy left top ,zw right bottom
////////////////////////////////////////////////////////////////////////////////
inline bool is_included_by_rect2_norm(const float4 rect1,const float4 rect2){
	return is_equal_rect_norm(intersect_rectangle_norm(rect1,rect2),rect1);
}
inline bool is_included_by_rect2(const int4 rect1,const int4 rect2){
	return is_equal_rect(intersect_rectangle(rect1,rect2),rect1);
}
inline float2 coordinate_normalization(const int2 pos,const float2 normalization_factor){
	return convert_float2(pos)*normalization_factor;
}
inline int2 coordinate_unnormalization(const float2 norm_pos,const int2 unnormalization_factor){
	return convert_int2(norm_pos*convert_float2(unnormalization_factor));
}
inline float4 rectangle_normalization(const int4 pos,const float2 normalization_factor){
	return convert_float4(pos)*(float4)(normalization_factor,normalization_factor);
}
inline int4 rectangle_unnormalization(const float4 norm_pos,const int2 unnormalization_factor){
	float2 unf=convert_float2(unnormalization_factor);
	return convert_int4(norm_pos*(float4)(unf,unf));
}
inline float2 get_normalization_factor(const int2 size){return 1.0f/convert_float2(size);}

#endif

#endif /* FACEDETECT_CL_FILES_RECT_UTILITS_H_ */
